package LinkedList;

import java.util.List;

/**
 * 移除链表元素，删除链表中等于给定值val的所有节点
 */
public class RemoveElements {
    public static void main(String[] args) {
        ListNode head=new ListNode(1);
        head.next=new ListNode(2);
        head.next.next=new ListNode(6);
        head.next.next.next=new ListNode(3);
        head.next.next.next.next=new ListNode(4);
        RemoveElements solution=new RemoveElements();
        ListNode res=solution.removeElements(head,2);
        while(res!=null){
            System.out.println(res.val);
            res=res.next;
        }
    }

    public ListNode removeElements(ListNode head,int val) {
        //分两种情况，第一种就是链表从开头的值就等于val，也就是上来的head==val
        while(head!=null&&head.val==val){
                head=head.next;
            }
        //第二种情况，head!=val，通过cur.next的val来判断
        ListNode cur=head;
        while(cur!=null && cur.next!=null){
            if(cur.next.val==val){
                cur.next=cur.next.next;
            }
            else{
                cur=cur.next;
            }
        }
        return head;
    }

    /**
     * 引入一个哑节点
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements2(ListNode head, int val){
        ListNode dummyNode = new ListNode();
        dummyNode.next = head;

        ListNode curNode = dummyNode;
        while(curNode.next != null){
            if(curNode.next.val == val){
                curNode.next = curNode.next.next;
            } else {
                curNode = curNode.next;
            }
        }
        return dummyNode.next;
    }
}

